#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=2e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int n,x;
void solve()
{
	cin>>n;
	set<int> cnt[n+1];
	for(int i=1;i<=n;i++) cin>>x, cnt[x].insert(i);//数组是存n+1个,每个数组的下标为那个数字,内容为那个数字的下标,保存位置信息

	int cur=0;//最远到哪里的下标,到n就删完了
	vector<int> ans;

	while(cur<n)
	{
		int t=0;
		if(cnt[0].empty())
		{
			for(int i=cur+1;i<=n;i++)//此时怎么取补集都是0
			{
				ans.push_back(0);
			}
			break;//跳出总循环
		}

		while(cnt[t].size())
		{
			cur=max(cur,*cnt[t++].begin());//从0开始找,元素为空的第一个数字,即为最大的MEX,这里cur拿到的是下标
		}
		ans.push_back(t);//t为最大的那么MEX


		for(int i=0;i<t;i++)
		{
			while(cnt[i].size()&&*cnt[i].begin()<=cur)//找到最大mex的下标,范围在mex范围内的所有值都会被删掉
			{
				cnt[i].erase(cnt[i].begin());
			}
		}
	}

	cout<<ans.size()<<'\n';
	for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
	cout<<'\n';
	
}

int main()
{
	close();
	int T; cin>>T;
	while (T--) solve();
	return 0;
}
//Mex (mathematics)
//补集的最小值
//Cu=5   0 1 2 3   MEX=4
//cu=4   0 1 2 3   mex=4
//CU=3   1 2 3     MEX=0;
//cu=3   1 2       MEX=0

//用a构造b 要求b的字典序最高


// 有一个原始序列,长度为n,序列中的每个数a[i]都满足0<=a[i]<=n,我们可以对序列进行操作,
// 每次取一个长度k,求出序列a[]的前k个数的MEX(a(k)),加入新序列b[]的尾部.(总集合就算0-k) 
// 其中MEX(X)的定义是没有在集合X的中出现的最小自然数,
// 如X={0,1,3,2,3,5,3,7},那么MEX(X)=4,因为0,1,2,3都在X中出现过 求字典序最大的b
//mex(S) 的值为集合 S 中没有出现过的最小自然数。例如，mex({1,2}) = 0、mex({0,1,2,1}) = 3